package com.pet.server.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.pet.server.domain.entity.PetOwner;
import com.pet.server.domain.entity.Serve;
import com.pet.server.domain.entity.ServeOrder;
import com.pet.server.domain.entity.Shop;
import com.pet.server.domain.vo.ServeOrderVO;
import com.pet.server.mapper.ServeOrderMapper;
import com.pet.server.service.IPetOwnerService;
import com.pet.server.service.IServeOrderService;
import com.pet.server.service.IServeService;
import com.pet.server.service.IShopService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;

@Service
@RequiredArgsConstructor
public class ServeOrderServiceImpl implements IServeOrderService {

  /** ServeOrderMapper */
  private final ServeOrderMapper mapper;

  /** 引入服务业务接口 */
  private final IServeService ss;

  /** 引入宠物主业务接口 */
  private final IPetOwnerService ps;

  /** 引入门店业务接口 */
  private final IShopService ishop;

  /**
   * 适用BeanUtils包转VO数据
   *
   * @param item 源数据
   * @param serve 子数据
   * @param petMaster 子数据
   * @param shop 子数据
   * @param vo 目标数据
   * @throws IllegalAccessException IllegalAccessException异常
   * @throws InvocationTargetException InvocationTargetException异常
   */
  private void ConvertDataToVO(
      ServeOrder item, Serve serve, PetOwner petMaster, Shop shop, ServeOrderVO vo)
      throws IllegalAccessException, InvocationTargetException {

    //// 拷贝相同字段的数据
    // BeanUtils.copyProperties(vo, item);
    //
    //// 拷贝服务对象数据
    // BeanUtils.copyProperty(vo, "serviceId", serve.getId());
    // BeanUtils.copyProperty(vo, "name", serve.getServeName());
    // BeanUtils.copyProperty(vo, "type", serve.getType());
    // BeanUtils.copyProperty(vo, "scheduling", serve.getScheduling());
    // BeanUtils.copyProperty(vo, "suitSpec", serve.getSuitSpec());
    // BeanUtils.copyProperty(vo, "serveSpec", serve.getServeSpec());
    // BeanUtils.copyProperty(vo, "timeConsuming", serve.getTimeConsuming());
    // BeanUtils.copyProperty(vo, "serveGrade", serve.getServeGrade());
    // BeanUtils.copyProperty(vo, "price", serve.getPrice());
    //
    //// 拷贝宠物主数据
    // BeanUtils.copyProperty(vo, "petMasterId", petMaster.getId());
    // BeanUtils.copyProperty(vo, "petMasterName", petMaster.getName());
    //// 拷贝门店数据
    // BeanUtils.copyProperty(vo, "shopId", shop.getId());
  }

  @Override
  public boolean updateServeOrderSelective(ServeOrderVO vo) {

    /*
     * 系统提供了对服务订单中的服务规格,适用规格,服务等级,排期时间,以及服务价格的修改权限 并且这些信息,都是包含在服务订单中的服务属性里面的 ,但是
     * 从前端传入的数据是一个Vo数据,所以我们需要创建一个新的Serve对象, 将vo数据中信息的数据赋值给Serve对象,再调用serve业务接口,对该对象进行修改
     */

    // 创建serve对象
    Serve serve = new Serve();

    // 设置服务id
    serve.setId(vo.getServiceId());

    // 设置服务规格
    serve.setServeStander(vo.getServeSpec());

    // 设置服务等级
    serve.setServeGrade(vo.getServeGrade());

    // 设置适用规格
    serve.setUsageStander(vo.getSuitSpec());

    // 设置价格
    serve.setServePrice(vo.getPrice());

    // 这设置排期
    serve.setServeSchedule(vo.getScheduling());

    // 调用接口,修改数据 ,并返回结果
    return ss.updateServeSelective(serve);
  }

  @Override
  public List<ServeOrderVO> getAllServeOrderList(int pageNo, int pageSize, int shopId) {
    QueryWrapper<ServeOrder> qw = new QueryWrapper<>();

    qw.eq("fk_shop_id", shopId);

    // 获取该门店下对应订单数据...
    Page<ServeOrder> page = mapper.selectPage(new Page<>(pageNo, pageSize), qw);

    // vo处理...
    // 提取订单数据
    List<ServeOrder> list = page.getRecords();

    // 创建一个存放Vo数据的List
    List<ServeOrderVO> voList = new ArrayList<>();

    // 将list中的po数据,转换为vo数据,并返回
    return getVOS(list, voList);
  }

  @Override
  public ServeOrderVO getServeOrderSelectiveById(int id, int shopId) {
    QueryWrapper<ServeOrder> qw = new QueryWrapper<>();

    qw.eq("fk_shop_id", shopId);

    // 查询门店下所有服务订单list
    List<ServeOrder> list = mapper.selectList(qw);
    ServeOrder order = null;

    // 遍历list,查找与id相等的订单
    for (ServeOrder item : list) {
      if (item.getId() == id) {
        order = item;
      }
    }

    if (order == null) {

      // 如果没有对应的订单信息,直接返回null
      return null;
    }

    // 如果 order 不为null

    /**
     * 由于服务订单对象中的数据不能直接展示在前端 所以需要进行vo数据转换
     *
     * <p>服务订单里面包含了服务订单本身的属性外,还包含有 服务项目的信息,宠物主的信息,以及对应的门店id 这些信息在ServeOrder类中是以外键的关系存在的,
     * 所以需要分别查出他们的信息之后,才能进行转换
     */

    // 获取服务对象数据
    Serve serve = ss.getServeSelective(order.getServeId());

    // 获取宠物主对象数据
    //    PetMaster petMaster = ps.getPetMasterSelectiveById(order.getPetMasterId());

    // 获取门店数据
    Shop shop = ishop.detail(order.getShopId());

    // 创建一个vo对象
    ServeOrderVO vo = new ServeOrderVO();

    //    try {
    //
    //      // 将order的数据通过BeanUtils工具进行copy
    //      //      ConvertDataToVO(order, serve, petMaster, shop, vo);
    //    } catch (IllegalAccessException | InvocationTargetException e) {
    //      e.printStackTrace();
    //    }

    // 返回vo数据
    return vo;
  }

  @Override
  public List<ServeOrderVO> getServeOrdersByPhoneNum(
      int pageNo, int pageSize, int shopId, String phone) {
    QueryWrapper<ServeOrder> qw = new QueryWrapper<>();

    qw.eq("fk_shop_id", shopId);

    // 获取门店下服务订单数据
    Page<ServeOrder> page = mapper.selectPage(new Page<>(pageNo, pageSize), qw);

    // 获取订单信息
    List<ServeOrder> list = page.getRecords();

    // 创建一个tempList 用于存放电话号码与查询的电话号码相同的订单list
    List<ServeOrder> tempList = new ArrayList<>();

    // 遍历集合订单集合
    for (ServeOrder item : list) {

      // 调用宠物主业务接口,获取每个item对应的宠物主对象数据
      //      PetMaster petMaster = ps.getPetMasterSelectiveById(item.getPetMasterId());
      //
      //      // 判断宠物主的电话号码与传入电话号码是否相同
      //      if (petMaster.getMasterPhone().equals(phone)) {
      //
      //        // 如果满足查询条件,就将对应的订单放入tempList
      //        tempList.add(item);
      //      }
    }

    if (tempList == null) {

      // 如果tempList为null,
      return null;
    }

    // 存放vo数据的list
    List<ServeOrderVO> voList = new ArrayList<>();

    // 转换Vo数据,并返回结果
    return getVOS(tempList, voList);
  }

  /**
   * 将对接数据库的数据 ,转换为对接view层的vo数据
   *
   * @param list DO数据源
   * @param voList VO数据集合
   * @return vo数据集合
   */
  private List<ServeOrderVO> getVOS(List<ServeOrder> list, List<ServeOrderVO> voList) {

    // 遍历list中每一个item
    for (ServeOrder item : list) {

      // 获取服务对象数据
      Serve serve = ss.getServeSelective(item.getId());

      // 获取宠物主对象数据
      //      PetMaster petMaster = ps.getPetMasterSelectiveById(item.getPetMasterId());

      // 获取门店对象数据
      Shop shop = ishop.detail(item.getShopId());
      ServeOrderVO vo = new ServeOrderVO();

      //      try {
      //
      //        // 数据转换
      //        //        ConvertDataToVO(item, serve, petMaster, shop, vo);
      //
      //        // 存放vo数据
      //        voList.add(vo);
      //      } catch (IllegalAccessException | InvocationTargetException e) {
      //        e.printStackTrace();
      //      }
    }

    // 返回数据
    return voList;
  }
}

// ~ Formatted by Jindent --- http://www.jindent.com
